﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Dao;
using _InformaticaIndustrial_DerivdosVinicos.DTO;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class AltaCV : Form
    {
        MateriaPrima _mpEntity;
        Componente _compEntity;
        RutaFabricacion _rfEntity;
        RF_CT _rf_ct;
        CentroTrabajo _ctrabajo;
        double ctoTotalMP = 0;
        float tarifaTotalMO = 0;
        double gtoTotalFabricacion = 0;
        IPRutaFabricacion _ipRutaFab = new IPRutaFabricacion();
        IPCentroTrabajo _ipCentroTrabajo = new IPCentroTrabajo();
        IPCostoVariable _ipCostoVariable = new IPCostoVariable();
        IList<RF_CT> rf_ctList = new List<RF_CT>();
        IList<CentroTrabajo> _ctList;
        CostosVariable _costoVariable;
        IList<EstructuraProducto> epList;

        public AltaCV()
        {
            InitializeComponent();
            cbProducto.DataSource = new IPProducto().getAll<Producto>();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            txtMP.Text = "";
            txtMO.Text = "";
            txtGF.Text = "";
            textBoxTotal.Text = "";
            tarifaTotalMO = 0;
            gtoTotalFabricacion = 0;
            ctoTotalMP = 0;

            CalcularCMP();
            CalcularMO();
            CalcularGF();

            txtMP.Text = ctoTotalMP.ToString();
            txtMO.Text = tarifaTotalMO.ToString();
            txtGF.Text = gtoTotalFabricacion.ToString();

            textBoxTotal.Text = ((((txtMP.Text != "") ? Convert.ToDouble(txtMP.Text) : 0) + ((txtMO.Text != "") ? Convert.ToDouble(txtMO.Text) : 0) + ((txtGF.Text != "") ? Convert.ToDouble(txtGF.Text) : 0)) / ((epList.Count > 0) ? epList.First().CantidadAProducir : 1)).ToString();
        }

        public void CalcularCMP()
        {
            try
            {
                int i = Convert.ToInt16(cbProducto.SelectedValue);

                epList = new IPEstructuraProducto().getByCriterio<EstructuraProducto>("", "", i.ToString());

                foreach (var item in epList)
                {
                    if (item.IdMateriaPrima != null)
                    {
                        _mpEntity = item.MateriaPrima; //;new IPMateriaPrima().GetMP(Convert.ToInt16(item.IdMateriaPrima));
                        CalcularCtoMP(_mpEntity, item); 
                    }
                    else
                    {
                        _compEntity = item.Componente;
                        CalcularCtoComponente(_compEntity, item);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void CalcularMO()
        {
            try
            {
                _rfEntity = _ipRutaFab.getCriterioById<RutaFabricacion>("", "", Convert.ToInt16(cbProducto.SelectedValue)).First();

                rf_ctList = _rfEntity.RF_CTs;//_ipRutaFab.GetRF_CT(_rfEntity.IdRF);

                foreach (var item in rf_ctList)
                {
                    _ctrabajo = item.CentroTrabajo; //_ipCentroTrabajo.getById(item.IdCT);
                    tarifaTotalMO += (float)((item.hsPreparacion * _ctrabajo.TarifaPreparacion) + (item.hsTrabajo * _ctrabajo.TarifaMO * _ctrabajo.CantPersonas));
                }
            }
            catch (Exception)
            {                
                throw;
            }
        }

        private void CalcularGF()
        {
            try
            {
                foreach (var item in rf_ctList)
                {
                    _ctrabajo = item.CentroTrabajo; //_ipCentroTrabajo.getById(item.IdCT);
                    gtoTotalFabricacion += (float)(_ctrabajo.TotalGtosFabricacion);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void CalcularCtoMP(MateriaPrima _mp, EstructuraProducto eprod)
        {
            //ctoTotalMP = 0;

            if (_mp.IdMP == eprod.IdMateriaPrima) //
            {
                ctoTotalMP += Convert.ToDouble(_mpEntity.costo * (eprod.cantidadMP));                
            }
            //else if(_mp.IdMP == 4 && eprod.IdMedidaMP == 2)
            //{
            //    ctoTotalMP += Convert.ToDouble(_mpEntity.costo * (eprod.cantidadMP / 1000));  
            //}
            //else
            //{
            //}
        }

        public void CalcularCtoComponente(Componente _comp, EstructuraProducto eprod)
        {
            if (_comp.IdComponente== eprod.IdComponente) //
            {
                ctoTotalMP += Convert.ToDouble(_comp.costo * (eprod.cantidadPC));
            }
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                _costoVariable = new CostosVariable();
                _costoVariable.CostoMP = (txtMP.Text != "") ? Convert.ToDouble(txtMP.Text) : 0;
                _costoVariable.CostoMO = (txtMO.Text != "") ? Convert.ToDouble(txtMO.Text) : 0;
                _costoVariable.CostoGF = (txtGF.Text != "") ? Convert.ToDouble(txtGF.Text) : 0;
                _costoVariable.IdProducto = Convert.ToInt16(cbProducto.SelectedValue);

                _ipCostoVariable.save<CostosVariable>(_costoVariable);

                MessageBox.Show("Costos variables guardados correctamente");
            }
            catch (Exception)
            {
                MessageBox.Show("Error al guardar Costos variablese");
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}
